# -*- coding: utf-8 -*-

"""
Token刷新接口
用于帮助用户在数据库迁移后获取新的有效token
"""

from flask import Blueprint, request
from flask_jwt_extended import create_access_token
from flasgger import swag_from
from app.models.user import User
from app.utils.response import success_response, error_response
from datetime import timedelta

token_refresh_bp = Blueprint('token_refresh', __name__)

@token_refresh_bp.route('/refresh_token', methods=['POST'])
@swag_from({
    'tags': ['Token管理'],
    'summary': 'Token刷新接口',
    'description': '用于在数据库迁移后帮助用户获取新的有效token',
    'parameters': [
        {
            'name': 'body',
            'in': 'body',
            'required': True,
            'schema': {
                'type': 'object',
                'properties': {
                    'user_id': {
                        'type': 'integer',
                        'description': '用户ID',
                        'example': 1
                    },
                    'phone': {
                        'type': 'string',
                        'description': '用户手机号（用于验证身份）',
                        'example': '13800138000'
                    },
                    'openid': {
                        'type': 'string',
                        'description': '微信openid（用于验证身份）'
                    }
                },
                'required': ['user_id']
            }
        }
    ],
    'responses': {
        200: {
            'description': 'Token刷新成功',
            'schema': {
                'type': 'object',
                'properties': {
                    'code': {'type': 'integer', 'example': 200},
                    'message': {'type': 'string', 'example': 'Token刷新成功'},
                    'data': {
                        'type': 'object',
                        'properties': {
                            'token': {'type': 'string', 'description': '新的JWT token'},
                            'user_id': {'type': 'integer', 'description': '用户ID'},
                            'expires_in': {'type': 'integer', 'description': 'Token有效期（小时）'}
                        }
                    }
                }
            }
        },
        400: {'description': '请求参数错误'},
        404: {'description': '用户不存在'},
        403: {'description': '身份验证失败'}
    }
})
def refresh_token():
    """刷新用户token"""
    data = request.get_json()
    
    if not data:
        return error_response('请求体不能为空', 400)
    
    user_id = data.get('user_id')
    phone = data.get('phone')
    openid = data.get('openid')
    
    if not user_id:
        return error_response('用户ID不能为空', 400)
    
    # 查找用户
    user = User.query.get(user_id)
    if not user:
        return error_response('用户不存在', 404)
    
    # 验证用户身份（通过手机号或openid）
    identity_verified = False
    
    if phone and user.phone == phone:
        identity_verified = True
    elif openid and user.openid == openid:
        identity_verified = True
    
    if not identity_verified:
        return error_response('身份验证失败，请提供正确的手机号或openid', 403)
    
    # 生成新token
    expires_hours = 168  # 7天
    access_token = create_access_token(
        identity=str(user.id),
        expires_delta=timedelta(hours=expires_hours)
    )
    
    return success_response({
        'token': access_token,
        'user_id': user.id,
        'expires_in': expires_hours,
        'user_info': {
            'id': user.id,
            'nickname': user.nickname,
            'phone': user.phone,
            'avatar_url': user.avatar_url
        }
    }, 'Token刷新成功')

@token_refresh_bp.route('/batch_refresh', methods=['POST'])
@swag_from({
    'tags': ['Token管理'],
    'summary': '批量Token刷新接口',
    'description': '为多个用户批量生成新token',
    'parameters': [
        {
            'name': 'body',
            'in': 'body',
            'required': True,
            'schema': {
                'type': 'object',
                'properties': {
                    'users': {
                        'type': 'array',
                        'items': {
                            'type': 'object',
                            'properties': {
                                'user_id': {'type': 'integer'},
                                'phone': {'type': 'string'},
                                'openid': {'type': 'string'}
                            }
                        }
                    },
                    'admin_token': {
                        'type': 'string',
                        'description': '管理员token（验证权限）'
                    }
                },
                'required': ['users', 'admin_token']
            }
        }
    ],
    'responses': {
        200: {
            'description': '批量刷新成功',
            'schema': {
                'type': 'object',
                'properties': {
                    'code': {'type': 'integer'},
                    'message': {'type': 'string'},
                    'data': {
                        'type': 'object',
                        'properties': {
                            'success_count': {'type': 'integer'},
                            'failed_count': {'type': 'integer'},
                            'results': {'type': 'array'}
                        }
                    }
                }
            }
        }
    }
})
def batch_refresh_tokens():
    """批量刷新用户token（管理员功能）"""
    data = request.get_json()
    
    if not data:
        return error_response('请求体不能为空', 400)
    
    users_data = data.get('users', [])
    admin_token = data.get('admin_token')
    
    if not admin_token:
        return error_response('需要管理员权限', 403)
    
    # TODO: 验证管理员token（简化版本跳过验证）
    
    results = []
    success_count = 0
    failed_count = 0
    
    for user_data in users_data:
        try:
            user_id = user_data.get('user_id')
            phone = user_data.get('phone')
            openid = user_data.get('openid')
            
            user = User.query.get(user_id)
            if not user:
                results.append({
                    'user_id': user_id,
                    'status': 'failed',
                    'error': '用户不存在'
                })
                failed_count += 1
                continue
            
            # 验证身份
            if (phone and user.phone == phone) or (openid and user.openid == openid):
                # 生成新token
                access_token = create_access_token(
                    identity=str(user.id),
                    expires_delta=timedelta(hours=168)
                )
                
                results.append({
                    'user_id': user_id,
                    'status': 'success',
                    'token': access_token
                })
                success_count += 1
            else:
                results.append({
                    'user_id': user_id,
                    'status': 'failed',
                    'error': '身份验证失败'
                })
                failed_count += 1
                
        except Exception as e:
            results.append({
                'user_id': user_data.get('user_id'),
                'status': 'failed',
                'error': str(e)
            })
            failed_count += 1
    
    return success_response({
        'success_count': success_count,
        'failed_count': failed_count,
        'results': results
    }, f'批量刷新完成，成功：{success_count}，失败：{failed_count}') 